﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Lab_finale_2
{
    static class TrameTool
    {
        /// <summary>
        /// bâtit la partie primaire de la trame sous forme de string.
        /// </summary>
        /// <remarks>Retourne une string composé des caractères encapsulateurs STX et ETX ainsi que le checksum</remarks>
        /// <returns>String qui est la trame à envoyer</returns>
        static public string  BuildTrame(string code)
        {
            string retour = ((char)2).ToString();
            retour += code + ((char)44).ToString();
            retour += CheckSumTrame(code) + ((char)3).ToString();

            return retour;
        }

        /// <summary>
        /// Cette fonction calcule le checksum d'une trame et le retourne sous forme d'une string
        /// </summary>
        public static string CheckSumTrame(string trame)
        {
            string retour = "";
            int longueur = trame.Length;
            int somme = 0;
            
            for (int i = 0; i < longueur; i++)
            {
                somme += (int)trame[i];
            }

            // Conversion de l'entier en hexadécimal
            retour = somme.ToString("X");
            // ici on ne garde que le dernier caractère
            retour = retour.Remove(0, retour.Length - 1);
            return retour;
        }

        /// <summary>
        /// Cette fonction prend une trame complète en paramètre et en vérifie la validité en calculant le checksum et en le comparant avec celui encapsuler dans la trame. Si le résultat est valide, on retourne vrai sinon faux.
        /// </summary>
        public static bool CompCheckSumTram(string trame)
        {
            bool retour = false;
            string checksum = "";
            // Le code contenu dans la trame;
            string code = UndressCode(trame);
            string temp = trame;
            temp = temp.Remove(0, temp.IndexOf(',') + 1);
            // le checksum est dans la variable
            checksum = temp.Remove(temp.Length - 1);

            // on envoie le code à CheckSumTrame
            temp = CheckSumTrame(code);
            if (checksum == temp)
                retour = true;
            return retour;
        }

        /// <summary>
        /// Cette méthode renvoie la donnée contenue dans la trame sous forme de string
        /// </summary>
        public static string UndressCode(string trame)
        {
            string retour = "";
            trame = trame.Remove(trame.IndexOf(','));
            trame = trame.Remove(0, 1);
            retour = trame;
            return retour;
        }
    }
}
